const express = require('express');
const router = express.Router();
const db = require('./models/db');
const upload = require('./models/upload');


const usersControllers = require('./controllers/user');
const topicsControllers = require('./controllers/topic');
const commentsControllers = require('./controllers/comment');
const sessionControllers = require('./controllers/session');
const replyControllers = require('./controllers/reply');
const likeControllers = require('./controllers/like')

//判断当前用户登录权限的中间件
function checkLogin(req,res,next){
  try{
    if(!req.session.sessionUser){
      return res.status(401).json({
        error:'Unauthorized'
      })
    }
    next()
  }catch (err) {
    next(err)
  }
}

async function checkTopic(req,res,next){
  try{
    //获取请求体,拿到当前需要被删除的话题的id
    const {id} = req.params;

    //根据根据当前话题id去查询这个话题的创造者，判断创造者是否为当前用户id，是否有权限删除话题
    const [topic] = await db.query(`SELECT * FROM topics where id=${id}`);

    //如果资源不存在，比如开了两个同样的页面，其中一个删了，然后另一个页面再去删就会发现没有当前资源
    if(!topic){
      return res.status(404).json({
        error:'TOPIC NOT FOUND'
      })
    }

    //如果当前话题的创造者不是当前用户id，则没有权限删除话题
    if(topic.user_id !== req.session.sessionUser.id){
      return res.status(400).json({
        error:'Action Invalid'
      })
    }

    next()
  }catch (err) {
    next(err)
  }
}

async function checkComment(req,res,next){
  try{
    //获取请求体,拿到当前需要被删除的评论的id
    const {id} = req.params;

    //根据根据当前评论id去查询这个评论
    const [comment] = await db.query(`SELECT * FROM comments where id=${id}`);

    //如果评论不存在，比如开了两个同样的页面，其中一个删了，然后另一个页面再去删就会发现没有当前资源
    if(!comment){
      return res.status(404).json({
        error:'COMMENT NOT FOUND'
      })
    }
    next()
  }catch (err) {
    next(err)
  }
}

/**
 * 用户资源
 */
router
    //登录时候的用户密码验证
    .get('/users',usersControllers.list)

    //创建用户
    .post('/users',usersControllers.create)

    //修改用户个人信息
    .patch('/users',usersControllers.update)

    //修改用户头像
    .post('/users/image',upload.single('image'),usersControllers.imgUpdate)

    //修改用户密码
    .patch('/users/admin',usersControllers.password)

    //删除用户
    .delete('/users/:id',usersControllers.destroy)


/**
 * 话题资源
 */
router
    .get('/topics',topicsControllers.list)
     //创建话题之前需要进行用户状态校验,判断当前是否存在已经登录的用户
     //很多地方都会需要进行用户状态校验，所以封装成函数checkLogin
    .get('/topics/:id',topicsControllers.one)
    .post('/topics',checkLogin,topicsControllers.create)
     //更新和删除话题之前同样需要进行用户id校验,判断当前登录的用户是否有权限进行操作
     //封装成函数checkTopic
    .patch('/topics/:id',checkLogin,checkTopic,topicsControllers.update)

    .delete('/topics/:id',checkLogin,checkTopic,topicsControllers.destroy)
/**
 * 评论资源
 */
router
    // 获取评论时不是获取所有评论，而是根据话题id返回指定话题对应的id
    // 带参数查询，即req.query,类似于/comments?article_id=100
    .get('/comments',commentsControllers.list)
    //新增评论是携带评论的内容即req.body
    .post('/comments',commentsControllers.create)
    //动态路由参数，req.params
    .patch('/comments/:id',commentsControllers.update)
    //删除评论
    .delete('/comments/:id',checkComment,commentsControllers.destroy)


/**
 * 回复资源
 */
router

    .post('/replies',replyControllers.create)
    .delete('/replies/:id',replyControllers.destroy)
/**
 * 点赞资源
 */
router
    //修改某一个用户对于某一条评论的点赞情况
    .patch('/likes/:id',likeControllers.update);
/**
 * 会话资源
 */
router
    .get('/session',sessionControllers.get)
    .post('/session',sessionControllers.create)
    .delete('/session',sessionControllers.destroy)

module.exports = router;